//class Base {
//public:
//	virtual void func1() { cout << "Base::func1" << endl; }
//	virtual void func2() { cout << "Base::func2" << endl; }
//	void func5() { cout << "Base::func5" << endl; }
//protected:
//	int a = 1;
//};
//class Derive : public Base
//{
//public:
//	// 重写基类的func1
//	virtual void func1() { cout << "Derive::func1" << endl; }
//	virtual void func3() { cout << "Derive::func3" << endl; }
//	void func4() { cout << "Derive::func4" << endl; }
//protected:
//	int b = 2;
//};
//typedef void(*VFPTR) ();
////void PrintVTable(VFPTR vTable[])
//void PrintVTable(VFPTR* vTable)
//{
//	cout << "虚表地址：" << vTable << endl;
//	for (int i = 0; vTable[i] != nullptr; ++i)
//	{
//		printf("第%d个虚函数：0x%p,->", i + 1, vTable[i]);
//		VFPTR f = vTable[i];
//		f();
//	}
//	cout << endl;
//}
//int main()
//{
//	Base b;
//	Derive d;
//
//	VFPTR* vTable1 = (VFPTR*)(*(int*)&b);
//	PrintVTable(vTable1);
//
//	VFPTR* vTable2 = (VFPTR*)(*(int*)&d);
//	PrintVTable(vTable2);
//
//	return 0;
//}

//class Base1 {
//public:
//	virtual void func1() { cout << "Base1::func1" << endl; }
//	virtual void func2() { cout << "Base1::func2" << endl; }
//};
//class Base2 {
//public:
//	virtual void func1() { cout << "Base2::func1" << endl; }
//	virtual void func2() { cout << "Base2::func2" << endl; }
//};
//class Derive : public Base1,public Base2
//{
//public:
//	// 重写基类的func1
//	virtual void func1() { cout << "Derive::func1" << endl; }
//	virtual void func3() { cout << "Derive::func3" << endl; }
//	void func4() { cout << "Derive::func4" << endl; }
//};
//typedef void(*VFPTR) ();
////void PrintVTable(VFPTR vTable[])
//void PrintVTable(VFPTR* vTable)
//{
//	cout << "虚表地址：" << vTable << endl;
//	for (int i = 0; vTable[i] != nullptr; ++i)
//	{
//		printf("第%d个虚函数：0x%p,->", i + 1, vTable[i]);
//		VFPTR f = vTable[i];
//		f();
//	}
//	cout << endl;
//}
//int main()
//{
//	Derive d;
//
//	VFPTR* vTable1 = (VFPTR*)(*(int*)&d);
//	PrintVTable(vTable1);
//
//	//VFPTR* vTable2 = (VFPTR*)(*(int*)((char*)&d + sizeof(Base1)));
//	Base2* ptr = &d;
//	VFPTR* vTable2 = (VFPTR*)(*(int*)ptr);
//	PrintVTable(vTable2);
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class A {
//public:
//	virtual void func1(){}
//	int _a;
//};
//class B : virtual public A {
//public:
//	virtual void func1(){}
//	virtual void func2(){}
//	int _b;
//};
//class C : virtual public A {
//public:
//	virtual void func1(){}
//	virtual void func3(){}
//	int _c;
//};
//class D : public B, public C {
//public:
//	virtual void func1(){}
//	virtual void func4(){}
//	int _d;
//};
//int main()
//{
//	D d;
//	d.B::_a = 1;
//	d.C::_a = 2;
//	d._a = 3;
//	d._b = 4;
//	d._c = 5;
//	d._d = 6;
//
//	//B b;
//	//b._a = 7;
//	//b._b = 8;
//	//B的指针指向B对象
//	//B* p2 = &b;
//	////B的指针指向D对象切片
//	//B* p1 = &d;
//
//	//p1->_a++;
//	//p2->_a++;
//	return 0;
//}

#include<iostream>
using namespace std;
class A {
public:
	virtual void func1() {}
	int _a;
};
class B : virtual public A {
public:
	virtual void func1() {}
	virtual void func2() {}
	int _b;
};
int main()
{
	A a;
	B b;

	return 0;
}